package com.qq.open.qzone.share;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.StringBody;

import com.qq.open.common.OpenQqConstants;
import com.qq.open.common.OpenQqException;
import com.qq.open.common.OpenQqUtils;
import com.qq.open.common.json.JSONException;
import com.qq.open.common.json.JSONObject;
import com.qq.open.qzone.bean.param.QqAddShareParamBean;
import com.qq.open.qzone.bean.result.QqAddShareResultBean;

/**
 * 
 * 发布一条动态（feeds）到QQ空间和朋友网
 * 
 * @author HaoLiang
 * @version 0.1.1
 *
 */
public class QqAddShare {

	/** QQ互联工具类 */
	private OpenQqUtils oqu = new OpenQqUtils();
	
	/**
	 * 发布一条动态（feeds）到QQ空间和朋友网
	 * 
	 * @param addShareBean 发布一条动态的参数Bean
	 * @return 分享结果
	 * @throws OpenQqException 
	 * @throws IOException 
	 * @throws JSONException 
	 */
	public QqAddShareResultBean addShare(QqAddShareParamBean addShareBean) throws OpenQqException, IOException, JSONException {
		
		// 分享结果
		String jsonData = oqu.doPost(OpenQqConstants.QQ_ADD_SHARE_URL,this.getAddSharParam(addShareBean));
		
		return this.jsonToBean(jsonData);
	}
	
	
	
	/**
	 * 获取发布动态的内容和参数信息
	 *    包含要发布的各种参数
	 * 
	 * @param addShareBean 参数Bean
	 * @return 请求参数
	 * @throws UnsupportedEncodingException 
	 */
	private MultipartEntity getAddSharParam(QqAddShareParamBean addShareBean) throws UnsupportedEncodingException {
		MultipartEntity reqEntity = new MultipartEntity();
		
		// AccessToken
	    reqEntity.addPart("access_token", new StringBody(addShareBean.getAccessToken()));
	    
	    // AppId
	    reqEntity.addPart("oauth_consumer_key", new StringBody(oqu.getConfigValue("qq.appid")));
	    
	    // OpenId
	    reqEntity.addPart("openid", new StringBody(addShareBean.getOpenId()));
		
		// 定义API返回的数据格式
	    reqEntity.addPart("format", new StringBody("json"));
		
		// feeds的标题
	    reqEntity.addPart("title", new StringBody(addShareBean.getTitle(), Charset.forName("UTF-8")));
		
		// 分享所在网页资源的链接
	    reqEntity.addPart("url", new StringBody(addShareBean.getUrl()));
		
	    // 用户评论内容，也叫发表分享时的分享理由
		if (oqu.isNotNull(addShareBean.getComment())) {
			reqEntity.addPart("comment", new StringBody(addShareBean.getComment(), Charset.forName("UTF-8")));
		}
		
		// 所分享的网页资源的摘要内容
		if (oqu.isNotNull(addShareBean.getSummary())) {
			reqEntity.addPart("summary", new StringBody(addShareBean.getSummary(), Charset.forName("UTF-8")));
		}
		
		// 所分享的网页资源的代表性图片链接
		if (oqu.isNotNull(addShareBean.getImages())) {
			reqEntity.addPart("images", new StringBody(addShareBean.getImages()));
		}
		
		// 分享的场景 
		if (oqu.isNotNull(addShareBean.getSource())) {
			// 取值说明：1.通过网页 2.通过手机 3.通过软件 4.通过IPHONE 5.通过 IPAD
			reqEntity.addPart("source", new StringBody(addShareBean.getSource()));
		}
		
		// 分享内容的类型
		if (oqu.isNotNull(addShareBean.getType())) {
			// 4表示网页；5表示视频（type=5时，必须传入playurl）
			reqEntity.addPart("type", new StringBody(addShareBean.getType()));
		}
		
		// 长度限制为256字节。仅在type=5的时候有效。
		if (oqu.isNotNull(addShareBean.getPlayUrl())) {
			reqEntity.addPart("playurl", new StringBody(addShareBean.getPlayUrl()));
		}
		
		// 值为1时，表示分享不默认同步到微博，其他值或者不传此参数表示默认同步到微博。
		if (oqu.isNotNull(addShareBean.getNswb())) {
			reqEntity.addPart("nswb", new StringBody(addShareBean.getNswb()));
		}
		
		return reqEntity;
	}
	
	
	/**
	 * 把接口返回的json数据转换成JavaBean
	 * 
	 * @param jsonData 接口返回的数据
	 * @return JavaBean数据
	 * @throws JSONException
	 */
	private QqAddShareResultBean jsonToBean(String jsonData) throws JSONException {
		QqAddShareResultBean resultBean = new QqAddShareResultBean();
		
		// 接口返回的数据json
		JSONObject jsonObjRoot = new JSONObject(jsonData);
		
		// 接口返回错误的场合
		if (jsonObjRoot.getInt("ret") != 0) {
			// 设置错误标识为真
			resultBean.setErrorFlg(true);
			
			// 设置错误编号
			resultBean.setErrorCode(jsonObjRoot.get("ret").toString());
			
			// 设置错误信息
			resultBean.setErrorMes(jsonObjRoot.getString("msg"));
		}
		
		return resultBean;
	}
	
}
